<?php

/**
 * 文件柜模块------ 本地我收到的共享
 *
 * @link http://www.ibos.com.cn/
 * @copyright Copyright &copy; 2008-2013 IBOS Inc
 * @author gzhzh <gzhzh@ibos.com.cn>
 */

/**
 * 文件柜模块------ 继承FileBaseController
 * @package application.modules.file.controllers
 * @version $Id: FromShareController.php 3297 2014-06-19 06:40:54Z gzhzh $
 * @author gzhzh <gzhzh@ibos.com.cn>
 */

namespace application\modules\file\controllers;

use application\core\utils\Convert;
use application\core\utils\Env;
use application\core\utils\IBOS;
use application\modules\file\model\File;
use application\modules\file\model\FileReader;
use application\modules\file\model\FileShare;
use application\modules\file\utils\FileCheck;
use application\modules\file\utils\FileData;
use application\modules\file\utils\FileOffice;
use application\modules\user\model\User;

class FromShareController extends BaseController {

	public function init() {
		parent::init();
		$this->belongType = File::BELONG_PERSONAL;
	}

	/**
	 * 列表
	 */
	public function actionIndex() {
		$params = array(
			'fromuid' => 0,
			'pid' => 0,
			'idpath' => File::TOP_IDPATH
		);
		$this->setPageTitle( IBOS::lang( 'From share' ) );
		$this->render( 'index', $params );
	}

	/**
	 * 获取数据
	 */
	public function actionGetCate() {
		$fromuid = intval( Env::getRequest( 'fromuid' ) );
		$pid = intval( Env::getRequest( 'pid' ) );
		$shareCon = $this->getShareCondition( $this->uid );
		$fileCon = $this->getFileCondition( $pid );
		if ( $pid ) { // 某个文件夹
			if ( !FileCheck::getInstance()->isReadable( $pid, $this->uid ) ) {
				$this->error( IBOS::lang( 'No read permission' ) );
			}
		} else if ( $fromuid ) { // 某个用户
			FileReader::model()->record( $fromuid, $this->uid );
			$fileCon = $shareCon . ' AND ' . $fileCon . " AND fs.`fromuid`={$fromuid}";
		} else { // 首页
			$con = $shareCon . ' AND ' . $this->getUserSearch();
			$list = FileShare::model()->getIndexList( $con );
			$list['datas'] = $this->handleIndexList( $list['datas'] );
		}
		if ( $pid || $fromuid ) {
			$this->search();
			$con = FileData::joinCondition( $this->condition, $fileCon );
			$list = FileShare::model()->getList( $con, $this->getOrder() );
			$list['datas'] = $this->handleList( $list['datas'] );
		}
		$params = array(
			'pid' => $pid,
			'data' => $list['datas'],
			'page' => $list['pages'],
			'breadCrumbs' => $this->getBreadCrumbs( $pid, $fromuid, $this->uid ),
			'pDir' => array_merge( FileData::getDirInfo( $pid ), array( 'access' => FileCheck::READABLED ) )
		);
		$this->ajaxReturn( $params );
	}

	/**
	 * 获得面包屑
	 * @param integer $pid 文件/文件夹id
	 * @param integer $fromuid 共享人uid
	 * @return array 面包屑数组
	 */
	private function getBreadCrumbs( $pid, $fromuid, $touid ) {
		$breadCrumbs = FileOffice::getBreadCrumb( $pid );
		$shareCon = $this->getShareCondition( $touid );
		foreach ( $breadCrumbs as $k => $bread ) {
			$record = IBOS::app()->db->createCommand()
					->from( "{{file_share fs}}" )
					->where( "fs.`fid`={$bread['fid']} AND " . $shareCon )
					->queryRow();
			if ( empty( $record ) ) {
				unset( $breadCrumbs[$k] );
			} else {
				break;
			}
		}
		if ( !$fromuid ) {
			if ( $pid ) {
				$file = File::model()->fetchByFid( $pid );
				$fromuid = $file['uid'];
			}
		}
		if ( $fromuid ) {
			$fromuser = User::model()->fetchByUid( $fromuid );
			array_unshift( $breadCrumbs, $fromuser );
		}
		return $breadCrumbs;
	}

	/**
	 * 处理显示数据
	 * @param array $list
	 * @return array
	 */
	private function handleIndexList( $list ) {
		foreach ( $list as $k => $li ) {
			$list[$k]['isnew'] = intval( $li['uptime'] ) - intval( $li['viewtime'] ) > 0;
			$list[$k]['formatuptime'] = date( 'Y/m/d', $li['uptime'] );
			$list[$k]['user'] = User::model()->fetchByUid( $li['fromuid'] );
		}
		return $list;
	}

	/**
	 * 获得某个用户收到共享的条件
	 * @param integer $uid 收到共享的用户id
	 * @return string
	 */
	protected function getShareCondition( $uid ) {
		$user = User::model()->fetchByUid( $uid );
		$depts = explode( ',', $user['alldeptid'] . ',alldept' );
		$deptCon = '';
		foreach ( $depts as $d ) {
			$deptCon .= " OR FIND_IN_SET('{$d}', fs.`todeptids`) ";
		}
		$con = "( FIND_IN_SET({$uid}, fs.`touids`) OR FIND_IN_SET({$user['positionid']}, fs.`toposids`) {$deptCon} )";
		return $con;
	}

	/**
	 * 获取查询条件
	 * @return string
	 */
	protected function getFileCondition( $pid ) {
		$con = array(
			'personalCon' => "f.`belong` = {$this->belongType}",
			'cloudCon' => "f.`cloudid` = {$this->cloudid}",
			'delCon' => "f.`isdel` = 0",
			'typeCon' => $this->getTypeCondition()
		);
		if ( !empty( $pid ) ) {
			$con['pidCon'] = "f.`pid` = {$pid}";
		}
		return implode( ' AND ', $con );
	}

	/**
	 * 我收到的首页搜索条件
	 * @param integer $pid 文件夹id
	 * @param integer $fromuid 分享用户id
	 * @return string
	 */
	protected function getUserSearch() {
		$con = 1;
		if ( Env::getRequest( 'search' ) == '1' ) {
			$keyword = \CHtml::encode( Env::getRequest( 'keyword' ) );
			$users = User::model()->fetchAll( "`realname` LIKE '%{$keyword}%'" );
			$uids = implode( ',', Convert::getSubByKey( $users, 'uid' ) );
			$con = " FIND_IN_SET(fs.fromuid, '{$uids}') ";
		}
		return $con;
	}

}
